Java注解学习
注解
作用分类:
- 编写文档:通过代码里标识的元数据生成文档(生成doc文档)
- 代码检查:通过代码里标识的元数据对代码进行分析(使用反射)
- 编译检查:通过代码里标识的元数据让编译器让编译器能够实现基本的编译检查(Override)
jdk中预定义的一些注解
@Override : 检测该注解标注的方法是否是继承自父类(接口)的
@Deprecate :该注解标注的内容表示已过时
@SuppressWarnings :压制警告(一般传参“all”)@SuppressWarnings("all")
@FunctionalInterface :标识接口是函数式接口
自定义注解
格式(分两块):
- 元注解
public @interface 注解名
本质
package com.alsritter;
public @interface MyAnoo {
}
在命令行里(javap命令)反编译生成的class文件

注解本质就是一个接口,该接口默认继承java.lang.annotation.Annotation
public interface com.alsritter.MyAnoo extends java.lang.annotation.Annotation {
}
属性
注解的属性就是接口中的抽象方法 当一个方法为抽象方法时,意味着这个方法应该被子类的方法所重写,否则其子类的该方法仍然是abstract的
-
要求:属性的返回值类型(反正就是不包括自定义类型和
void)- 基本数据类型(不包括包装类)
- String
- 枚举
- 注解
- 以上类型的数组
-
定义了属性,在使用时就要属性赋值
-
但是可以设置默认值,这样的话不赋值就自动用默认值(
default关键字) -
如果只有一个属性需要赋值,那么可以设置这个属性叫
value,这样可以省略写属性名
//定义一个注解
public @interface MyAnno {
int age() default 18;
String value();
}
//使用这个注解
@MyAnno("张三")
public class Student {
}
// 赋值一览
@myAnno2(value = 12,per = Person.p1,anno3 = @MyAnno3,strs={"aa","bb"})
元注解
用于描述注解的注解
@Target:描述注解能够作用的位置 使用:ElementType 枚举
@Retention:描述被保留的阶段(源码,class,RunTime)使用:RetentionPolicy 枚举
@Documented:描述注解是否被抽取到api文档
@Inherited:描述注解是否被子类继承
在程序中解析注解
获取注解中定义的属性值 就是通过反射的方式
- 如果注解是定义在类上
MyAnno myAnno = studentClass.getAnnotation(MyAnno.class); - 如果注解是定义在方法上
MyAnno myAnno = method.getAnnotations(MyAnno.class)